#!/usr/bin/env python
# coding=utf-8
# @FileName :json_util.py
# @Time     :2022/2/10 13:08
# @Author   :ZXC
# @Desc     :JSON读写工具类
import json

from loguru import logger


class JsonUtil(object):
    @staticmethod
    def dict_to_str(data, sort_keys: bool = True, indent: int = 4) -> str:
        """
        将python中的 字典、列表 转换成字符串
        Args:
            data: 字典、列表数据
            sort_keys: 是否排序
            indent: 格式化缩进

        Returns: 字符串

        """
        logger.debug(f'正在转换python数据为字符串')
        value = json.dumps(data, sort_keys=sort_keys, indent=indent, ensure_ascii=False)
        logger.debug(f'转换python数据到文件完成')
        return value

    @staticmethod
    def dict_to_file(data, file_path, sort_keys: bool = True, indent: int = 4):
        """
        将python中的 字典、列表数据写入文件
        Args:
            data: 字典、列表数据
            file_path: 文件路径
            sort_keys: 是否排序
            indent: 格式化缩进

        Returns:

        """
        logger.debug(f'正在转换python数据到文件')
        try:
            with open(file_path, 'w', encoding='utf-8') as f:
                json.dump(data, f, sort_keys=sort_keys, indent=indent)
                logger.debug(f'转换python数据到文件完成')
        except Exception as e:
            raise Exception(f'转换到文件失败===>{e}')

    @staticmethod
    def str_to_dict(data_str: str) -> dict:
        """
        将字符串转换成json
        Args:
            data_str: 字符串json数据

        Returns:

        """
        logger.debug(f'正在转换字符串为python数据')

        if isinstance(data_str, str):  # 首先判断变量是否为字符串
            try:
                value = json.loads(data_str)
                logger.debug(f'转换字符串为python数据完成')
                return value
            except Exception as e:
                raise ValueError(f'转换字符串为python数据失败，请检查数据格式及内容{e}')
        else:
            raise ValueError('被转换对象非字符串对象')

    @staticmethod
    def file_to_dict(file_path):
        """

        Args:
            file_path: json文件路径

        Returns:json格式的字典或列表或字符串

        """

        logger.debug(f'正在转换文件为python数据')
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                value = json.load(f)
                logger.debug(f'转换文件为python数据完成')
                return value
        except FileNotFoundError:
            raise FileNotFoundError(f'文件{file_path}不存在,转换文件失败')
        except Exception as e:
            raise Exception(f'转换文件失败{e}')


if __name__ == '__main__':
    data_dict = {
        'name': 'zxc',
        'age': 18
    }
    from config.settings import CONFIG_DIR

    filepath = CONFIG_DIR.joinpath('config.json')

    print(JsonUtil.dict_to_str(data_dict))
    JsonUtil.dict_to_file(data_dict, filepath)
    data_strs = '{"name": "wade", "age": 54, "gender": "man"}'
    print(JsonUtil.str_to_dict(data_strs))
    print(JsonUtil.file_to_dict(filepath))
